package main

import (
	"fmt"
	"os"
	"strconv"
	"strings"
)

//@ 稀疏数组

type ValNode struct {
	row int
	col int
	val int
}

func sort() {
	var arr [10]int = [10]int{1, 2, 9, 4, 3, 5, 12, 43, 7, 6}

	for i := 0; i < 10; i++ {
		for j := i; j < 10-i-1; j++ {
			if arr[j] > arr[j+1] {
				temp := arr[j]
				arr[j] = arr[j+1]
				arr[j+1] = temp
			}
		}
	}
	fmt.Println(arr)
}

func main() {

	//1 .先创建一个原始数组
	var chessMap [11][11]int

	chessMap[1][2] = 1 //黑子
	chessMap[2][3] = 2 //

	// 2. 输出原始数组
	for _, v := range chessMap {
		for _, v1 := range v {
			fmt.Printf("%d\t", v1)
		}
		fmt.Println()
	}

	// 3.转换成稀疏数组
	//
	//1.遍历啊chessMap , 如果我们发现有一个元素的值不为0， 创建一个node 结构体
	//2.将其放入到对应的切片中

	var sparseArray []ValNode

	// 标准的稀疏数组 应该 还含有 一行 记录原始数组的信息(行，列，默认值)
	sparseArray = append(sparseArray, ValNode{row: 11, col: 11, val: 0})

	for i, v := range chessMap {
		for j, v1 := range v {
			if v1 != 0 {
				sparseArray = append(sparseArray, ValNode{row: i, col: j, val: v1})
			}
		}
	}

	fmt.Println(sparseArray)

	// 写入到文件

	file, err := os.OpenFile("./test.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
	if err != nil {
		fmt.Printf("open failed")
	}

	defer file.Close()

	for _, v := range sparseArray {
		fmt.Printf("%d %d %d\n", v.row, v.col, v.val)
		row := strconv.Itoa(v.row)
		col := strconv.Itoa(v.col)
		val := strconv.Itoa(v.val)
		str := strings.Join([]string{row, col, val}, " ")
		file.WriteString(str + "\n")
	}

	// 恢复为原始的数组

	// 创建一个原始数组
	var chessMap2 [11][11]int

	for i, v := range sparseArray {
		if i == 0 {
			continue
		}
		chessMap2[v.row][v.col] = v.val
	}

	fmt.Println(chessMap2)
}
